package ooday04;

public class LiLun {
    /*
    多态：
        即多重形态。
        向上造型/自动类型转换：
            1)超类型的引用指向派生类的对象                         超类大、派生类小
            Animal o = new Animal();    //动物是动物
            Dog o = new Dog();          //狗是狗
            Animal o = new Dog();       //狗是动物 ---正确
            Dog o = new Animal();       //动物是狗 ---编译错误

            2)能点出来什么，看引用的类型
            Person p1 = new Student("李四",24,"佳木斯","jsd2406","002");
            Person p2 = new Teacher("王五",35,"山东",6000.0);
            Person p3 = new Doctor("赵六",46,"北京","主任医师");
            p1/p2/p3 只能点出Person类中的

            Animal o1 = new Dog("小黑",3,"黑");
            Animal o2 = new Chick("小花",1,"花");
            Animal o3 = new Fish("小金",2,"金");
            o1/o2/o3 只能点出Animal类中的

            Student p1 = new Student("李四",24,"佳木斯","jsd2406","002");//学生是学生
            Person p2 = new Student("李四",24,"佳木斯","jsd2406","002");//学生是人

            3)可以向上成为的类型有：所继承的类+所实现的接口
            Dog o1 = new Dog("小黑",2,"黑");//狗是狗
            Animal o2 = new Dog("小黑",2,"黑");//狗是动物
            Swim o3 = new Dog("小黑",2,"黑");//狗会游泳

        向上造型的应用
            应用1：将超类型作为参数或返回值类型，传递或返回派生类对象，以扩大方法的应用范围 -----实现代码复用
            应用2：将不同对象统一装到超类数组中来访问 ------实现代码复用

        向下转型
            何时向下转型：若想访问的属性或行为在超类中没有时，需向下转型
            向下转型/强制类型转换
                1)引用所指向的对象，就是该类型
                2)引用所指向的对象，实现了该接口或继承了该类
                 强转时若不符合如上条件，则发生ClassCastException类型转换异常
                 建议：在强转之前先通过instanceof判断引用指向的对象是否是该类型 --->为true的条件就是强转成功的条件
     */


    /*
    内部类
        成员内部类（了解）
            什么事成员内部类：
                类中套类
                    class Aoo{ //外部类
                        class Boo{ //内部类
                        }
                    }
            成员内部类的特点
                内部类通常只服务于外部类，对外不具备可见性
                内部类对象通常在外部类中创建
                内部类中可以直接访问外部类的成员
                内部类中有个隐式的引用指向了创建它的外部类对象 ----外部类名.this
            成员内部类何时用
                何时用：若Boo类只让Aoo类用，并且Boo类还想访问Aoo类的成员时，可以设计成员内部类，简化代码

         匿名内部类
            匿名内部类何时用
                若想创建一个派生类对象，并且对象只创建一次，可以设计为匿名内部类
     */


    /*
    package关键字
        用于声明包
        作用：避免类的命名冲突
        规则：同包中的类不能同名
        类的全称：包名.类名
        建议：包名常常有层次结构，所有字母都小写
     */


    /*
    import关键字
        用于导入类
        同包中的类可以直接访问，但不同包中的类不能直接访问，
            若想访问：1)类的全称 -----------------太繁琐，不建议
                    2)先import导入类再使用类 -----建议
     */
}











